package com.wjk.test;

/**
 * @author : RobertWei
 * time: 2021/9/9    17:35
 * description:颜色分类
 */

public class Demo {

    static int red = 0;
    static int white = 1;
    static int blue = 2;

    public static void main(String[] args) {

        int[] nums = {2, 0, 2, 1, 1, 0,2,1,2,1,2,0};

        sortColors(nums);

    }


    public static void sortColors(int[] nums) {

        //健壮性校验
        if (nums == null || nums.length <= 1 || nums.length >= 300) {
            System.out.println("数据输入有误...");
            return;
        }
        //三种颜色的数量
        //red 指针
        int countRed = 0;
        //red 和 white 数量之和为 white 的指针
        int countWhite = 0;

        for (int i = 0; i < nums.length; i++) {
            //每次操作只改变数组中前 i 个元素的值, 保证数组中未读取到的值不改变

            //第 i 个元素为 red
            if (nums[i] == red) {
                //blue 元素整体向后移动一位
                nums[i] = blue;
                //white 元素移动到红色和白色总和位置
                nums[countRed + countWhite] = white;
                //red 元素的数量 +1
                nums[countRed++] = red;
            }
            //第 i 个元素为 red
            else if (nums[i] == white) {
                //blue 元素整体向后移动一位
                nums[i] = blue;
                //white 元素移动到红色和白色总和位置, white 数量 +1
                nums[countRed + countWhite++] = white;
                //red 元素的数量不变
            }
            //第 i 个元素为 blue
            //保持第 i 个元素为 blue, 不增加 red 和 white 的数量
        }

        for (int num : nums) {
            System.out.print(num + " ");
        }

    }

}
